import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import '../../../common/services/index.dart';
import '../../../common/mixins/index.dart';
import '../../../common/routers/index.dart';

/// 我的页面控制器
/// 负责用户个人信息展示和相关操作
/// 遵循GetX控制器标准化结构（9个部分）
/// 使用UserProfileMixin提供用户信息访问能力
class MyIndexController extends GetxController with UserProfileMixin {
  // 1. 静态常量（类级别）- 使用lowerCamelCase命名
  static const String tag = 'MyIndexController';
  static const int maxRetryCount = 3;
  static const Duration refreshTimeout = Duration(seconds: 30);
  static const Duration logoutTimeout = Duration(seconds: 10);
  
  // 2. 实例常量
  final String pageTitle = '我的';
  final String welcomeMessage = '欢迎使用';
  final String appVersion = '1.0.0';
  
  // 3. 响应式变量（Rx系列）- 使用.obs写法（推荐95%场景）
  // 基础类型响应式变量
  var isLoading = false.obs;                    // RxBool - 加载状态
  var isRefreshing = false.obs;                 // RxBool - 刷新状态
  var hasError = false.obs;                     // RxBool - 错误状态
  var retryCount = 0.obs;                       // RxInt - 重试次数
  var errorMessage = ''.obs;                    // RxString - 错误信息
  
  // 集合类型响应式变量
  var settingsMenu = <MenuItem>[].obs;          // RxList<MenuItem> - 设置菜单项
  
  // 注意：头像相关状态由 UserService 统一管理，无需在此重复定义
  
  // 可空类型响应式变量（特殊场景使用）
  var lastRefreshTime = RxnString();            // RxnString - 上次刷新时间（可空）
  
  // 4. 普通变量（非响应式）
  bool _isInitialized = false;
  int _internalRetryCount = 0;
  
  // 5. 控制器和服务依赖
  // 服务依赖
  UserService get _userService => Get.find<UserService>();
  
  // 6. 构造函数
  MyIndexController() {
    debugPrint('$tag: Constructor - 控制器已创建 ${DateTime.now()}');
  }
  
  // 7. 私有初始化方法
  void _initData() {
    debugPrint('$tag: 初始化我的页面数据');
    
    if (!_isInitialized) {
      // 初始化设置菜单
      _initSettingsMenu();
      
      // 检查用户登录状态
      _checkUserLoginStatus();
      
      // 设置UserService响应式数据监听
      _setupUserServiceListeners();
      
      // 设置已初始化标志
      _isInitialized = true;
      
      debugPrint('$tag: 页面数据初始化完成');
    }
    
    // 通知UI更新
    update(["my_index"]);
  }
  
  /// 初始化设置菜单
  void _initSettingsMenu() {
    settingsMenu.assignAll([
      MenuItem(
        icon: Icons.settings_outlined,
        title: '设置',
        subtitle: '个人设置和偏好',
      ),
      MenuItem(
        icon: Icons.info_outline,
        title: '关于我们',
        subtitle: '应用信息和版本',
      ),
    ]);
    debugPrint('$tag: 设置菜单初始化完成');
  }
  
  /// 检查用户登录状态
  void _checkUserLoginStatus() {
    final isLoggedIn = _userService.isLoggedIn;
    debugPrint('$tag: 用户登录状态检查 - isLoggedIn: $isLoggedIn');
    
    if (!isLoggedIn) {
      debugPrint('$tag: 用户未登录，清理本地状态');
      _clearLocalState();
    }
  }
  
  /// 清理本地状态
  void _clearLocalState() {
    hasError.value = false;
    errorMessage.value = '';
    retryCount.value = 0;
    lastRefreshTime.value = null;
  }
  
  /// 设置UserService响应式数据监听
  /// 当UserService中的用户信息发生变化时，自动更新UI
  void _setupUserServiceListeners() {
    debugPrint('$tag: 设置UserService响应式数据监听');
    
    // 监听UserProfileModel变化 - 这是核心响应式数据
    ever(_userService.currentUserProfileRx, (userProfile) {
      debugPrint('$tag: UserService用户信息模型发生变化，自动更新UI');
      debugPrint('$tag: 新用户信息: ${userProfile?.username ?? "无"}');
      update(["my_index"]);
    });
    
    // 监听登录状态变化
    ever(_userService.isLoggedInRx, (isLoggedIn) {
      debugPrint('$tag: UserService登录状态发生变化: $isLoggedIn，更新UI');
      update(["my_index"]);
    });
    
    // 🔥 监听好友数量变化
    ever(_userService.friendCountRx, (count) {
      debugPrint('$tag: UserService好友数量发生变化: $count，更新UI');
      update(["my_index"]);
    });
    
    debugPrint('$tag: ✅ 响应式监听器设置完成 - 用户信息变化将自动同步到UI');
  }
  
  // 8. 业务方法
  
  // ==================== 用户信息访问 ====================
  // 注意：用户信息访问方法已通过 UserProfileMixin 提供
  // 可直接使用: userDisplayName, userName, userAvatarUrl, isLoggedIn 等
  // ✅ 等级相关信息也已通过 UserProfileMixin 提供：
  //    - userLevelName: 等级名称（如"大玩家"）
  //    - userLevelProgress: 等级进度信息
  // 
  // 🎯 无需在此重复定义，直接使用 Mixin 提供的即可
  
  // ==================== 刷新相关方法 ====================
  
  /// 刷新用户信息
  Future<void> refreshUserInfo() async {
    try {
      isRefreshing.value = true;
      hasError.value = false;
      errorMessage.value = '';
      update(["my_index"]);
      
      debugPrint('$tag: 开始刷新用户信息');
      
      // 重置重试计数
      _internalRetryCount = 0;
      
      // 模拟API请求延迟
      await Future.delayed(const Duration(milliseconds: 800));
      
      // 更新最后刷新时间
      lastRefreshTime.value = DateTime.now().toString();
      
      debugPrint('$tag: 用户信息刷新完成');
      _showSuccessMessage('用户信息已刷新');
      
    } catch (e) {
      debugPrint('$tag: 刷新用户信息失败: $e');
      _handleRefreshError('获取用户信息失败，请稍后重试');
    } finally {
      isRefreshing.value = false;
      update(["my_index"]);
    }
  }
  
  /// 处理刷新错误
  void _handleRefreshError(String message) {
    retryCount.value++;
    _internalRetryCount++;
    
    if (_internalRetryCount < maxRetryCount) {
      debugPrint('$tag: 刷新失败，准备重试 (${_internalRetryCount}/$maxRetryCount)');
      // 延迟重试
      Future.delayed(const Duration(seconds: 2), () {
        if (_internalRetryCount < maxRetryCount) {
          refreshUserInfo();
        }
      });
    } else {
      _handleError(message);
    }
  }
  
  // ==================== 退出登录相关方法 ====================
  
  /// 退出登录（不显示确认弹窗，由View层处理）
  /// 直接执行退出登录操作
  void onLogoutTap() async {
    try {
      debugPrint('$tag: 用户确认退出登录，开始执行退出操作');
      await _performLogout();
    } catch (e) {
      debugPrint('$tag: 退出登录异常: $e');
      _showErrorMessage('退出登录时发生错误，请重试');
    }
  }
  
  /// 执行退出登录
  Future<void> _performLogout() async {
    try {
      isLoading.value = true;
      hasError.value = false;
      update(["my_index"]);
      
      debugPrint('$tag: 开始执行退出登录流程');
      
      // 调用用户服务退出登录（带超时控制）
      final success = await _userService.logout().timeout(
        logoutTimeout,
        onTimeout: () {
          debugPrint('$tag: 退出登录超时');
          return false;
        },
      );
      
      if (success) {
        debugPrint('$tag: 退出登录成功');
        
        // 清理本地状态
        _clearLocalState();
        
        // 🚀 直接跳转到登录页面（使用offAllNamed清除所有路由栈）
        debugPrint('$tag: 跳转到登录页面');
        Get.offAllNamed(RouteNames.systemLogin);
        
      } else {
        debugPrint('$tag: 退出登录失败');
        _handleError('退出登录失败，请重试');
      }
      
    } catch (e) {
      debugPrint('$tag: 执行退出登录异常: $e');
      _handleError('退出登录时发生错误');  
    } finally {
      isLoading.value = false;
      update(["my_index"]);
    }
  }
  
  // ==================== 头像相关方法 ====================
  
  /// 头像点击 - 跳转到用户信息页面
  void onAvatarTap() {
    debugPrint('$tag: 用户点击头像');
    
    if (!isLoggedIn) {
      _showErrorMessage('请先登录');
      return;
    }
    
    // 跳转到用户信息页面（使用常规页面跳转）
    Get.toNamed(RouteNames.myUserInfo);
    debugPrint('$tag: 跳转到用户信息页面');
  }
  
  // ==================== 头像操作相关方法 ====================
  
  /// 更换头像
  Future<void> onChangeAvatarTap() async {
    debugPrint('$tag: 用户点击更换头像');
    
    try {
      // 这里可以集成图片选择器
      // 例如：image_picker 插件
      _showInfoMessage('更换头像功能正在开发中...\n请稍后再试');
      
      // TODO: 实现图片选择和上传逻辑
      // 1. 调用图片选择器选择新头像
      // 2. 压缩和裁剪图片
      // 3. 上传到服务器
      // 4. 更新用户信息
      
    } catch (e) {
      debugPrint('$tag: 更换头像失败: $e');
      _showErrorMessage('更换头像失败，请重试');
    }
  }
  
  /// 保存头像
  Future<void> onSaveAvatarTap() async {
    debugPrint('$tag: 用户点击保存头像');
    
    try {
      isLoading.value = true;
      
      // 这里可以保存当前头像到本地相册
      _showInfoMessage('保存头像功能正在开发中...\n请稍后再试');
      
      // TODO: 实现头像保存逻辑
      // 1. 下载当前头像图片
      // 2. 保存到本地相册
      // 3. 显示保存成功提示
      
      await Future.delayed(const Duration(milliseconds: 500));
      
    } catch (e) {
      debugPrint('$tag: 保存头像失败: $e');
      _showErrorMessage('保存头像失败，请重试');
    } finally {
      isLoading.value = false;
    }
  }
  
  /// 查看闪忆码
  Future<void> onViewFlashCodeTap() async {
    debugPrint('$tag: 用户点击查看闪忆码');
    
    try {
      // 这里可以展示用户的闪忆码
      _showInfoMessage('查看闪忆码功能正在开发中...\n请稍后再试');
      
      // TODO: 实现闪忆码查看逻辑
      // 1. 获取用户的闪忆码信息
      // 2. 展示闪忆码页面或二维码
      // 3. 提供分享功能
      
    } catch (e) {
      debugPrint('$tag: 查看闪忆码失败: $e');
      _showErrorMessage('查看闪忆码失败，请重试');
    }
  }
  
  // ==================== 设置和功能相关方法 ====================
  
  /// 编辑用户信息点击
  void onEditProfileTap() {
    debugPrint('$tag: 用户点击编辑信息');
    
    if (!isLoggedIn) {
      _showErrorMessage('请先登录');
      return;
    }
    
    // 跳转到个人信息编辑页面
    Get.toNamed(RouteNames.myPeofileDetial);
    debugPrint('$tag: 跳转到个人信息编辑页面');
  }
  
  // ==================== 菜单功能相关方法 ====================
  
  /// 我的发布点击
  void onMyPublishTap() {
    debugPrint('$tag: 用户点击我的发布');
    
    if (!isLoggedIn) {
      _showErrorMessage('请先登录');
      return;
    }
    
    // 跳转到我的发布页面
    Get.toNamed(RouteNames.activityMyPublish);
    debugPrint('$tag: 跳转到我的发布页面');
  }
  
  /// 活动申请用户管理点击
  void onActivityApplicationTap() {
    debugPrint('$tag: 用户点击活动申请用户管理');
    
    if (!isLoggedIn) {
      _showErrorMessage('请先登录');
      return;
    }
    
    // 跳转到活动申请管理页面
    Get.toNamed(RouteNames.activityApplicationMangement);
    debugPrint('$tag: 跳转到活动申请管理页面');
  }
  
  /// 积分充值点击
  void onFundsTap() {
    debugPrint('$tag: 用户点击积分充值');
    
    if (!isLoggedIn) {
      _showErrorMessage('请先登录');
      return;
    }
    
    // 跳转到资金页面
    Get.toNamed(RouteNames.myFunds);
    debugPrint('$tag: 跳转到积分充值页面');
  }
  
  /// 等级和积分制度规则点击
  void onLevelRulesTap() {
    debugPrint('$tag: 用户点击等级和积分制度规则');
    
    if (!isLoggedIn) {
      _showErrorMessage('请先登录');
      return;
    }
    
    // 跳转到等级规则页面
    Get.toNamed(RouteNames.myRules);
    debugPrint('$tag: 跳转到等级和积分制度规则页面');
  }
  
  /// 账号安全点击
  void onSecurityTap() {
    debugPrint('$tag: 用户点击账号安全');
    
    if (!isLoggedIn) {
      _showErrorMessage('请先登录');
      return;
    }
    
    // 跳转到账号安全页面
    Get.toNamed(RouteNames.mySecurity);
    debugPrint('$tag: 跳转到账号安全页面');
  }
  
  /// 反馈与客服点击
  void onFeedbackTap() {
    debugPrint('$tag: 用户点击反馈与客服');
    
    if (!isLoggedIn) {
      _showErrorMessage('请先登录');
      return;
    }
    
    // 跳转到反馈页面
    Get.toNamed(RouteNames.myFeedback);
    debugPrint('$tag: 跳转到反馈与客服页面');
  }
  
  /// 实名认证点击
  void onVerifyTap() {
    debugPrint('$tag: 用户点击实名认证');
    
    if (!isLoggedIn) {
      _showErrorMessage('请先登录');
      return;
    }
    
    // 跳转到实名认证页面
    Get.toNamed(RouteNames.myVerify);
    debugPrint('$tag: 跳转到实名认证页面');
  }
  
  /// 设置点击
  void onSettingsTap() {
    debugPrint('$tag: 用户点击设置');
    
    if (!isLoggedIn) {
      _showErrorMessage('请先登录');
      return;
    }
    
    // 跳转到设置页面
    Get.toNamed(RouteNames.mySettings);
    debugPrint('$tag: 跳转到设置页面');
  }
  
  /// 粉丝数点击 - 跳转到消息列表
  void onFollowersTap() {
    debugPrint('$tag: 用户点击粉丝数');
    
    if (!isLoggedIn) {
      _showErrorMessage('请先登录');
      return;
    }
    
    // 跳转到消息列表页面
    Get.toNamed(RouteNames.messageMessageIndex);
    debugPrint('$tag: 跳转到消息列表页面');
  }

  /// 昵称点击 - 编辑用户信息
  void onUserNameTap() {
    debugPrint('$tag: 用户点击昵称');
    
    if (!isLoggedIn) {
      _showErrorMessage('请先登录');
      return;
    }
    
    // 跳转到个人信息编辑页面
    Get.toNamed(RouteNames.myPeofileDetial);
    debugPrint('$tag: 通过昵称点击跳转到个人信息编辑页面');
  }
  
  /// 测试按钮点击
  void onTestTap() {
    debugPrint('$tag: 用户点击测试按钮');
    
    // 跳转到测试页面（使用toNamed进行常规页面跳转）
    Get.toNamed(RouteNames.testTestIndex);
    debugPrint('$tag: 跳转到测试页面');
  }
  
  /// 关于我们点击
  void onAboutTap() {
    debugPrint('$tag: 用户点击关于我们');
    
    Get.dialog(
      AlertDialog(
        title: const Text('关于我们'),
        content: Text('$welcomeMessage\n版本: $appVersion\n© 2025 All Rights Reserved'),
        actions: [
          TextButton(
            onPressed: () => Get.back(),
            child: const Text('确定'),
          ),
        ],
      ),
    );
  }
  
  // ==================== 消息提示相关方法 ====================
  
  /// 显示成功消息
  void _showSuccessMessage(String message) {
    Get.snackbar(
      '成功',
      message,
      snackPosition: SnackPosition.TOP,
      backgroundColor: Colors.green.withOpacity(0.8),
      colorText: Colors.white,
      duration: const Duration(seconds: 2),
    );
  }
  
  /// 显示错误消息
  void _showErrorMessage(String message) {
    Get.snackbar(
      '错误',
      message,
      snackPosition: SnackPosition.TOP,
      backgroundColor: Colors.red.withOpacity(0.8),
      colorText: Colors.white,
      duration: const Duration(seconds: 3),
    );
  }
  
  /// 显示信息消息
  void _showInfoMessage(String message) {
    Get.snackbar(
      '提示',
      message,
      snackPosition: SnackPosition.BOTTOM,
      backgroundColor: Colors.blue.withOpacity(0.8),
      colorText: Colors.white,
      duration: const Duration(seconds: 2),
    );
  }
  
  // ==================== 错误处理相关方法 ====================
  
  /// 处理错误
  void _handleError(String message) {
    hasError.value = true;
    errorMessage.value = message;
    
    debugPrint('$tag: 处理错误 - $message');
    _showErrorMessage(message);
    
    update(["my_index"]);
  }
  
  /// 重置错误状态
  void resetErrorState() {
    debugPrint('$tag: 重置错误状态');
    
    hasError.value = false;
    errorMessage.value = '';
    retryCount.value = 0;
    _internalRetryCount = 0;
    
    update(["my_index"]);
  }

  // 9. 生命周期方法
  @override
  void onInit() {
    super.onInit();
    debugPrint('$tag: onInit - 控制器初始化');
  }

  @override
  void onReady() {
    super.onReady();
    debugPrint('$tag: onReady - 页面准备就绪');
    _initData();
  }

  @override
  void onClose() {
    debugPrint('$tag: onClose - 控制器销毁');
    
    // 清理资源（如果有的话）
    _clearLocalState();
    
    super.onClose();
  }
}

/// 菜单项模型
class MenuItem {
  final IconData icon;
  final String title;
  final String subtitle;

  const MenuItem({
    required this.icon,
    required this.title,
    required this.subtitle,
  });
}

